/**  
 * @Title: SubAccountServiceImpl.java
 * @Package org.wk.digiccy.service
 * @Description: TODO【】
 * @author df.w 
 * @date 2018年5月9日 下午5:11:17
 * @version V1.0  
 */ 

package org.wk.account.service;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;


import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Strings;
import com.google.gson.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.wk.account.dao.SubAccountDao;
import org.wk.account.dao.bao.SubAccountBaoDao;
import org.wk.account.dao.bao.SubAccountBaoSeqDao;
import org.wk.account.dao.ling.SubAccountLingDao;
import org.wk.account.dao.ling.SubAccountLingSeqDao;
import org.wk.account.dao.yuan.SubAccountYuanDao;
import org.wk.account.dao.yuan.SubAccountYuanSeqDao;
import org.wk.account.dao.yuan.SubAccountYuanVipActivateBillDao;
import org.wk.account.dao.zai.SubAccountZaiDao;
import org.wk.account.dao.zai.SubAccountZaiSeqDao;
import org.wk.account.dao.zai.SubAccountZaiVipActivateBillDao;
import org.wk.account.dao.zhong.SubAccountZhongDao;
import org.wk.account.dao.zhong.SubAccountZhongSeqDao;
import org.wk.account.dao.zuan.SubAccountZuanDao;
import org.wk.account.dao.zuan.SubAccountZuanSeqDao;
import org.wk.account.domain.SubAccount;
import org.wk.account.domain.bao.SubAccountBao;
import org.wk.account.domain.bao.SubAccountBaoSeq;
import org.wk.account.domain.ling.SubAccountLing;
import org.wk.account.domain.ling.SubAccountLingSeq;
import org.wk.account.domain.yuan.SubAccountYuan;
import org.wk.account.domain.yuan.SubAccountYuanSeq;
import org.wk.account.domain.yuan.SubAccountYuanVipActivateBill;
import org.wk.account.domain.zai.SubAccountZai;
import org.wk.account.domain.zai.SubAccountZaiSeq;
import org.wk.account.domain.zai.SubAccountZaiVipActivateBill;
import org.wk.account.domain.zhong.SubAccountZhong;
import org.wk.account.domain.zhong.SubAccountZhongSeq;
import org.wk.account.domain.zuan.SubAccountZuan;
import org.wk.account.domain.zuan.SubAccountZuanSeq;
import org.wk.account.enums.*;
import org.wk.account.view.AccountSeqsVo;
import org.wk.core.common.view.PageVo;
import org.wk.core.common.view.ResponseVo;
import org.wk.core.db.tool.WebUtils;
import org.wk.user.dao.UserDao;
import org.wk.user.domain.ApplyVip;
import org.wk.user.domain.User;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;


/**
 * @ClassName	: SubAccountServiceImpl
 * @Package		：org.wk.digiccy.service
 * @Author df.w 
 * @Create Time	：2018年5月9日 下午5:11:17
 * @Description	: 
 */
@Service
public class SubAccountServiceImpl implements SubAccountService {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private UserDao userDao;
	@Autowired
	private SubAccountDao subAccountDao;
	
	@Autowired
	private SubAccountZuanService subAccountZuanService;


	@Autowired
	private SubAccountZaiDao subAccountZaiDao;
	@Autowired
	private SubAccountZaiSeqDao subAccountZaiSeqDao;
	@Autowired
	private SubAccountZaiVipActivateBillDao subAccountZaiVipActivateBillDao;

	@Autowired
	private SubAccountYuanDao subAccountYuanDao;
	@Autowired
	private SubAccountYuanSeqDao subAccountYuanSeqDao;
	@Autowired
	private SubAccountYuanVipActivateBillDao subAccountYuanVipActivateBillDao;

	@Autowired
	private SubAccountZuanDao subAccountZuanDao;
	@Autowired
	private SubAccountBaoDao subAccountBaoDao;
	@Autowired
	private SubAccountLingDao subAccountLingDao;
	@Autowired
	private SubAccountZhongDao subAccountZhongDao;
	@Autowired
	private SubAccountBaoSeqDao subAccountBaoSeqDao;
	@Autowired
	private SubAccountZhongSeqDao subAccountZhongSeqDao;
	@Autowired
	private SubAccountZuanSeqDao subAccountZuanSeqDao;
	@Autowired
	private SubAccountLingSeqDao subAccountLingSeqDao;
	@Autowired
	private SubAccountBaoService subAccountBaoService;
	@Autowired
	private SubAccountZaiService subAccountZaiService;
	@Autowired
	private SubAccountZhongService subAccountZhongService;
	@Autowired
	private SubAccountLingService subAccountLingService;
	@Autowired
	private SubAccountYuanService subAccountYuanService;



	/* (非 Javadoc)
	 * <p>Title: selectSubAccount</p>
	 * <p>Description: </p>
	 * @return
	 * @see org.wk.digiccy.service.SubAccountService#selectSubAccount()
	 */

	@Override
	public ResponseVo selectSubAccount() {
		// TODO Auto-generated method stub
		String userId = WebUtils.getUser().getId();
		//首先检查账户信息，如果没有账户信息则插入账户信息
		checkAccountNum(userId);
		//查询用户帐号信息
		List<SubAccount> subAccounts = subAccountDao.findByUserId(userId);

		return ResponseVo.success().setData(subAccounts);
	}

	/**
	 * 用户的每种子账户详情
	 * @author TangShenShen
	 * @date 2018/5/29 11:51
	 */
	@Override
	public ResponseVo findSubAccoutDetail(String accountTypeCode) {
		String userId = WebUtils.getUser().getId();
		AccountType accountType = AccountType.containsCode(accountTypeCode);
		if (null==accountType) {
			return new ResponseVo(ResponseCode.ACCOUNT_TYPE_ERROR);
		}

		if (AccountType.JING_BAO.getCode().equals(accountTypeCode)){
			SubAccountBao subAccountBao = subAccountBaoDao.findByUserId(userId);
			if (subAccountBao==null){
				subAccountBao = new SubAccountBao();
				subAccountBao.setUserId(userId);
//				subAccountBao.setAmount(new BigDecimal("0"));
				subAccountBao = subAccountBaoDao.save(subAccountBao);
			}
			BigDecimal amount = subAccountBao.getAmount();
			Map<String,BigDecimal> resData = new HashMap<>();
			resData.put("amount",amount);
			return ResponseVo.success().setData(resData);
		}

		if (AccountType.JING_LING.getCode().equals(accountTypeCode)){
			SubAccountLing subAccountLing = subAccountLingDao.findByUserId(userId);
			if (subAccountLing==null){
				subAccountLing = new SubAccountLing();
				subAccountLing.setUserId(userId);
				subAccountLing = subAccountLingDao.save(subAccountLing);
			}
			return ResponseVo.success().setData(subAccountLing);
		}

		if (AccountType.JING_YUAN.getCode().equals(accountTypeCode)){
			SubAccountYuan subAccountYuan = subAccountYuanDao.findByUserId(userId);
			if (subAccountYuan==null){
				subAccountYuan = new SubAccountYuan();
				subAccountYuan.setUserId(userId);
				subAccountYuan = subAccountYuanDao.save(subAccountYuan);
			}
			return ResponseVo.success().setData(subAccountYuan);
		}

		if (AccountType.JING_ZAI.getCode().equals(accountTypeCode)){
			SubAccountZai subAccountZai = subAccountZaiDao.findByUserId(userId);
			if (subAccountZai==null){
				subAccountZai = new SubAccountZai();
				subAccountZai.setUserId(userId);
				subAccountZai.setAmount(new BigDecimal("0"));
				subAccountZai = subAccountZaiDao.save(subAccountZai);
			}
			return ResponseVo.success().setData(subAccountZai);
		}

		if (AccountType.JING_ZHONG.getCode().equals(accountTypeCode)){
			SubAccountZhong subAccountZhong = subAccountZhongDao.findByUserId(userId);
			if (subAccountZhong==null){
				subAccountZhong = new SubAccountZhong();
				subAccountZhong.setUserId(userId);
				subAccountZhong.setAmount(0);
				subAccountZhong = subAccountZhongDao.save(subAccountZhong);
			}
			return ResponseVo.success().setData(subAccountZhong);
		}

		if (AccountType.JING_ZUAN.getCode().equals(accountTypeCode)){
			SubAccountZuan subAccountZuan = subAccountZuanDao.findByUserId(userId);
			if (subAccountZuan==null){
				subAccountZuan = new SubAccountZuan();
				subAccountZuan.setUserId(userId);
				subAccountZuan.setAmount(0);
				subAccountZuan = subAccountZuanDao.save(subAccountZuan);
			}
			return ResponseVo.success().setData(subAccountZuan);
		}
		return ResponseVo.error();
	}


	/**
	 * 创建账户体系
	 * @param userId
	 */
	@Override
	public void checkAccountNum(String userId) {
		// TODO Auto-generated method stub
		int number = AccountType.values().length;	
		List<SubAccount> subAccounts = subAccountDao.findByUserId(userId);
		List<SubAccount> needSave = new ArrayList<>();
		SubAccount subAccount;
		if (subAccounts.size()<number) {	
			//取出没有的账户记录
			List<String> accountCodes = new ArrayList<>();
			for (SubAccount subAccount2 : subAccounts) {
				accountCodes.add(subAccount2.getAccountTypeCode());
			}

			for (AccountType accountType : AccountType.values()) {
				if (!accountCodes.contains(accountType.getCode())) {
					subAccount = new SubAccount();
					subAccount.setUserId(userId);
					subAccount.setAccountTypeCode(accountType.getCode());
					subAccount.setAccountTypeName(accountType.getName());
					subAccount.setAmount(new BigDecimal(0));
					needSave.add(subAccount);
					//鲸钻账户
					if (AccountType.JING_ZUAN.equals(accountType)) {
						SubAccountZuan subAccountZuan = subAccountZuanDao.findByUserId(userId);
						if (null == subAccountZuan) {
							subAccountZuan = new SubAccountZuan();
							subAccountZuan.setUserId(userId);
							subAccountZuanDao.save(subAccountZuan);
						}
					} else if (AccountType.JING_YUAN.equals(accountType)) {
						SubAccountYuan subAccountYuan = subAccountYuanDao.findByUserId(userId);
						if (null == subAccountYuan) {
							subAccountYuan = new SubAccountYuan();
							subAccountYuan.setUserId(userId);
							subAccountYuanDao.save(subAccountYuan);
						}
					} else if (AccountType.JING_ZAI.equals(accountType)) {
						SubAccountZai subAccountZai = subAccountZaiDao.findByUserId(userId);
						if (null == subAccountZai) {
							subAccountZai = new SubAccountZai();
							subAccountZai.setUserId(userId);
							subAccountZaiDao.save(subAccountZai);
						}
					} else if (AccountType.JING_BAO.equals(accountType)) {
						SubAccountBao subAccountBao = subAccountBaoDao.findByUserId(userId);
						if (null == subAccountBao) {
							subAccountBao = new SubAccountBao();
							subAccountBao.setUserId(userId);
							subAccountBaoDao.save(subAccountBao);
						}
					} else if (AccountType.JING_ZHONG.equals(accountType)) {
						SubAccountZhong subAccountZhong = subAccountZhongDao.findByUserId(userId);
						if (null == subAccountZhong) {
							subAccountZhong = new SubAccountZhong();
							subAccountZhong.setUserId(userId);
							subAccountZhongDao.save(subAccountZhong);
						}
					} else if (AccountType.JING_LING.equals(accountType)) {
						SubAccountLing subAccountLing = subAccountLingDao.findByUserId(userId);
						if (null == subAccountLing) {
							subAccountLing = new SubAccountLing();
							subAccountLing.setUserId(userId);
							subAccountLingDao.save(subAccountLing);
						}
					}
				}	
			}
		
		}		
		if (!needSave.isEmpty()) {
			subAccountDao.saveBatch(needSave);
		}
	}

	/**
	 * 注册账户变动
	 * 注册后赠送鲸钻
	 * @param userId
	 * @return
	 */
	@Override
	public boolean registerAccountHandler(String userId) {
		// TODO Auto-generated method stub
		//注册用户后，账户变动只有鲸钻的奖励
		return subAccountZuanService.registerAward(userId);
	}

	/**
	 * 注册账户变动
	 * 注册后赠送鲸钻
	 * @param userId
	 * @return
	 */
	@Override
	public boolean promoteAccountHandler(String userId) {
		// TODO Auto-generated method stub
		//推广奖励
		return subAccountZuanService.promoteAward(userId);
	}


	@Override
	public boolean loginAccountHandler(String userId) {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public boolean vipActivateHandler(String userId) {
		//激活vip 赠送2000鲸仔  8000鲸源
		BigDecimal zaiNum = new BigDecimal(2000);
		BigDecimal yuanNum = new BigDecimal(8000);
		/**
		 * 鲸仔处理
		 */
		SubAccountZaiVipActivateBill subAccountZaiVipActivateBill = new SubAccountZaiVipActivateBill();
		subAccountZaiVipActivateBill.setUserId(userId);
		subAccountZaiVipActivateBill.setAmount(zaiNum);
		subAccountZaiVipActivateBillDao.save(subAccountZaiVipActivateBill);

		SubAccountZai subAccountZai = subAccountZaiDao.findByUserId(userId);
		subAccountZai = subAccountZai==null?new SubAccountZai():subAccountZai;
		BigDecimal preZaiAmount = subAccountZai.getAmount()==null?new BigDecimal(0):subAccountZai.getAmount();
		subAccountZai.setUserId(userId);
		subAccountZai.setAmount(preZaiAmount.add(zaiNum));
		subAccountZaiDao.saveOrUpdate(subAccountZai);

		SubAccountZaiSeq subAccountZaiSeq = new SubAccountZaiSeq();
		subAccountZaiSeq.setUserId(userId);
		subAccountZaiSeq.setSeqFlagCode(SeqFlag.INCOME.getCode());
		subAccountZaiSeq.setSeqFlagName(SeqFlag.INCOME.getName());
		subAccountZaiSeq.setChangeTypeCode(ZaiChangeType.VIP_ACTIVATE.getCode());
		subAccountZaiSeq.setChangeTypeName(ZaiChangeType.VIP_ACTIVATE.getName());
		subAccountZaiSeq.setPreAmount(preZaiAmount);
		subAccountZaiSeq.setAmount(subAccountZai.getAmount());
		subAccountZaiSeq.setChangeAmount(zaiNum);
		subAccountZaiSeqDao.save(subAccountZaiSeq);

		SubAccount subAccount = subAccountDao.findByUserIdAndAccountTypeCode(userId, AccountType.JING_ZAI.getCode());
		subAccount.setAmount(subAccountZai.getAmount());
		subAccountDao.update(subAccount);
		/**
		 * 鲸源处理
		 */
		SubAccountYuanVipActivateBill subAccountYuanVipActivateBill = new SubAccountYuanVipActivateBill();
		subAccountYuanVipActivateBill.setUserId(userId);
		subAccountYuanVipActivateBill.setAmount(yuanNum);
		subAccountYuanVipActivateBillDao.save(subAccountYuanVipActivateBill);

		SubAccountYuan subAccountYuan = subAccountYuanDao.findByUserId(userId);
		subAccountYuan = subAccountYuan==null?new SubAccountYuan():subAccountYuan;
		BigDecimal preYuanAmount = subAccountYuan.getAmount();
		subAccountYuan.setUserId(userId);
		subAccountYuan.setAmount(preYuanAmount.add(yuanNum));
		subAccountYuanDao.saveOrUpdate(subAccountYuan);

		SubAccountYuanSeq subAccountYuanSeq = new SubAccountYuanSeq();
		subAccountYuanSeq.setUserId(userId);
		subAccountYuanSeq.setSeqFlagCode(SeqFlag.INCOME.getCode());
		subAccountYuanSeq.setSeqFlagName(SeqFlag.INCOME.getName());
		subAccountYuanSeq.setChangeTypeCode(YuanChangeType.VIP_ACTIVATE.getCode());
		subAccountYuanSeq.setChangeTypeName(YuanChangeType.VIP_ACTIVATE.getName());
		subAccountYuanSeq.setPreAmount(preYuanAmount);
		subAccountYuanSeq.setAmount(subAccountYuan.getAmount());
		subAccountYuanSeq.setChangeAmount(yuanNum);
		subAccountYuanSeqDao.save(subAccountYuanSeq);

		subAccount = subAccountDao.findByUserIdAndAccountTypeCode(userId, AccountType.JING_YUAN.getCode());
		subAccount.setAmount(subAccountYuan.getAmount());
		subAccountDao.update(subAccount);

		return true;
	}

	/**
	 * 账户变动列表
	 * @param accountTypeCode
	 * @return
	 */
	@Override
	public ResponseVo findSubAccountSeqs(String accountTypeCode, int pageNum, int pageSize) {
		String userId = WebUtils.getUser().getId();
		AccountType accountType = AccountType.containsCode(accountTypeCode);
		if (null==accountType) {
			return new ResponseVo(ResponseCode.ACCOUNT_TYPE_ERROR);
		}

		pageNum = pageNum<1?1:pageNum;
		pageNum -=1;
		pageSize = pageSize<1?10:pageSize;
		if (AccountType.JING_BAO.getCode().equals(accountTypeCode)){
			SubAccountBaoSeq subAccountBaoSeq = new SubAccountBaoSeq();
			subAccountBaoSeq.setUserId(userId);
			Page<SubAccountBaoSeq> page = subAccountBaoService.findSeqByCriteria(pageNum,pageSize,subAccountBaoSeq);
			return ResponseVo.success().setData(pageHandler(page));
		}

		if (AccountType.JING_ZUAN.getCode().equals(accountTypeCode)){
			SubAccountZuanSeq subAccountZuanSeq = new SubAccountZuanSeq();
			subAccountZuanSeq.setUserId(userId);
			Page<SubAccountZuanSeq> page = subAccountZuanService.findSeqByCriteria(pageNum,pageSize,subAccountZuanSeq);
			return ResponseVo.success().setData(pageHandler(page));
		}

		if (AccountType.JING_ZHONG.getCode().equals(accountTypeCode)){
			SubAccountZhongSeq subAccountZhongSeq = new SubAccountZhongSeq();
			subAccountZhongSeq.setUserId(userId);
			Page<SubAccountZhongSeq> page = subAccountZhongService.findSeqByCriteria(pageNum,pageSize,subAccountZhongSeq);
			return ResponseVo.success().setData(pageHandler(page));
		}

		if (AccountType.JING_ZAI.getCode().equals(accountTypeCode)){
			SubAccountZaiSeq subAccountZaiSeq = new SubAccountZaiSeq();
			subAccountZaiSeq.setUserId(userId);
			Page<SubAccountZaiSeq> page = subAccountZaiService.findSeqByCriteria(pageNum,pageSize,subAccountZaiSeq);
			return ResponseVo.success().setData(pageHandler(page));
		}

		if (AccountType.JING_LING.getCode().equals(accountTypeCode)){
			SubAccountLingSeq subAccountLingSeq = new SubAccountLingSeq();
			subAccountLingSeq.setUserId(userId);
			Page<SubAccountLingSeq> page = subAccountLingService.findSeqByCriteria(pageNum,pageSize,subAccountLingSeq);
			return ResponseVo.success().setData(pageHandler(page));
		}

		if (AccountType.JING_YUAN.getCode().equals(accountTypeCode)){
			SubAccountYuanSeq subAccountYuanSeq = new SubAccountYuanSeq();
			subAccountYuanSeq.setUserId(userId);
			Page<SubAccountYuanSeq> page = subAccountYuanService.findSeqByCriteria(pageNum,pageSize,subAccountYuanSeq);
			return ResponseVo.success().setData(pageHandler(page));
		}

		return ResponseVo.error();
	}

	/**
	 *  账户变动列表  (PC用户详情中变动列表)
	 * @author TangShenShen  
	 * @date 2018/6/2 9:17  
	 */  
	@Override
	public ResponseVo getSubAccountSeqs(String userId, String accountTypeCode, int pageNum, int pageSize) {
		AccountType accountType = AccountType.containsCode(accountTypeCode);
		if (null==accountType) {
			return new ResponseVo(ResponseCode.ACCOUNT_TYPE_ERROR);
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		List<AccountSeqsVo> result = new ArrayList<>();
		pageNum = pageNum<1?1:pageNum;
		pageNum -=1;
		pageSize = pageSize<1?10:pageSize;
		if (AccountType.JING_BAO.getCode().equals(accountTypeCode)){
			SubAccountBaoSeq subAccountBaoSeq = new SubAccountBaoSeq();
			subAccountBaoSeq.setUserId(userId);
			Page<SubAccountBaoSeq> page = subAccountBaoService.findSeqByCriteria(pageNum,pageSize,subAccountBaoSeq);

			for (SubAccountBaoSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);

			/*for (SubAccountBaoSeq seq :page.getContent()){
				AccountSeqsVo accountSeqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq, accountSeqsVo);
				accountSeqsVo.setCreateTime(sdf.format(seq.getCreateTime()));

				resoultList.add(accountSeqsVo);
			}
			return ResponseVo.success().setData(pageProcessor(page));*/
		}

		if (AccountType.JING_ZUAN.getCode().equals(accountTypeCode)){
			SubAccountZuanSeq subAccountZuanSeq = new SubAccountZuanSeq();
			subAccountZuanSeq.setUserId(userId);
			Page<SubAccountZuanSeq> page = subAccountZuanService.findSeqByCriteria(pageNum,pageSize,subAccountZuanSeq);
			for (SubAccountZuanSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(new BigDecimal(seq.getChangeAmount()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);
		}

		if (AccountType.JING_ZHONG.getCode().equals(accountTypeCode)){
			SubAccountZhongSeq subAccountZhongSeq = new SubAccountZhongSeq();
			subAccountZhongSeq.setUserId(userId);
			Page<SubAccountZhongSeq> page = subAccountZhongService.findSeqByCriteria(pageNum,pageSize,subAccountZhongSeq);
			for (SubAccountZhongSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(new BigDecimal(seq.getChangeAmount()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);
		}

		if (AccountType.JING_ZAI.getCode().equals(accountTypeCode)){
			SubAccountZaiSeq subAccountZaiSeq = new SubAccountZaiSeq();
			subAccountZaiSeq.setUserId(userId);
			Page<SubAccountZaiSeq> page = subAccountZaiService.findSeqByCriteria(pageNum,pageSize,subAccountZaiSeq);
			for (SubAccountZaiSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(seq.getChangeAmount());
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);
		}

		if (AccountType.JING_LING.getCode().equals(accountTypeCode)){
			SubAccountLingSeq subAccountLingSeq = new SubAccountLingSeq();
			subAccountLingSeq.setUserId(userId);
			Page<SubAccountLingSeq> page = subAccountLingService.findSeqByCriteria(pageNum,pageSize,subAccountLingSeq);
			for (SubAccountLingSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(seq.getChangeAmount());
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);
		}

		if (AccountType.JING_YUAN.getCode().equals(accountTypeCode)){
			SubAccountYuanSeq subAccountYuanSeq = new SubAccountYuanSeq();
			subAccountYuanSeq.setUserId(userId);
			Page<SubAccountYuanSeq> page = subAccountYuanService.findSeqByCriteria(pageNum,pageSize,subAccountYuanSeq);
			for (SubAccountYuanSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);
		}


		return ResponseVo.error();
	}

	@Override
	public ResponseVo selectSubAccountSeqs(String accountType, Map<String, Object> params) {
		if (null==AccountType.containsCode(accountType)) {
			return new ResponseVo(ResponseCode.ACCOUNT_TYPE_ERROR);
		}
		String realName = (String) params.get("realName");
		String mobileNumber = (String) params.get("mobileNumber");
		// 根据条件查询用户
		List<User> list = userDao.findAll(new Specification<User>() {
			@Override
			public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
				List<Predicate> list = new ArrayList<Predicate>();
				if (!StringUtils.isEmpty(realName)){
					list.add(criteriaBuilder.like(root.get("realName").as(String.class), "%"+realName+"%"));
				}
				if(!StringUtils.isEmpty(mobileNumber)){
					list.add(criteriaBuilder.like(root.get("mobileNumber").as(String.class), "%"+mobileNumber+"%"));
				}
				Predicate[] p = new Predicate[list.size()];
				return criteriaBuilder.and(list.toArray(p));
			}
		});
		List<String> userIds = new ArrayList<>();
		// 根据用户id集合
		if (null!=list && list.size()>0){
			for (User user : list){
				userIds.add(user.getId());
			}
			int page = Integer.parseInt((String) params.get("page"));
			int limit = Integer.parseInt((String) params.get("limit"));
			// 变动分页记录
			PageVo pages = getSeqsByUserIds(userIds, accountType, page, limit);
			List<AccountSeqsVo> resoultList = new ArrayList<>(); // 返回的分页数据
			// 变动记录
			resoultList = pages.getResult();
			/*List<User> users = userDao.findByIdIn(userIds);  // 分页用户集合*/
			// 遍历集合  封装数据
			for (AccountSeqsVo seqsVo : resoultList) {
				String userid =  seqsVo.getUserId();
				if (!"".equals(userid) && userid != null) {
					for (User user : list) {
						if (userid.equals(user.getId())){
							seqsVo.setUserId(user.getId());
							seqsVo.setRealName(user.getRealName());
							seqsVo.setMobileNumber(user.getMobileNumber());
							break;
						}
					}
				}
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(pages.getTotal());
			pageVo.setPageNo(page);
			pageVo.setPageSize(limit);
			pageVo.setResult(resoultList);
			pageVo.setTotalPages(pages.getTotalPages());
			return ResponseVo.success().addAttribute("page",pageVo);
		}

		return ResponseVo.success();

	}

	public PageVo<AccountSeqsVo> getSeqsByUserIds(List<String> userIds, String accountTypeCode, int pageNum, int pageSize) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		List<AccountSeqsVo> result = new ArrayList<>();
		pageNum = pageNum<1?1:pageNum;
		pageNum -=1;
		pageSize = pageSize<1?10:pageSize;
		if (AccountType.JING_BAO.getCode().equals(accountTypeCode)){
			Page<SubAccountBaoSeq> page = subAccountBaoService.findSeqByUserIds(pageNum,pageSize,userIds);
			for (SubAccountBaoSeq seq :page) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return pageVo;
		}

		if (AccountType.JING_ZUAN.getCode().equals(accountTypeCode)){
			Page<SubAccountZuanSeq> page = subAccountZuanService.findSeqByUserIds(pageNum,pageSize,userIds);
			for (SubAccountZuanSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(new BigDecimal(seq.getChangeAmount()));
				seqsVo.setPreAmount(new BigDecimal(seq.getPreAmount()));
				seqsVo.setAmount(new BigDecimal(seq.getAmount()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return pageVo;
		}

		if (AccountType.JING_ZHONG.getCode().equals(accountTypeCode)){
			Page<SubAccountZhongSeq> page = subAccountZhongService.findSeqByUserIds(pageNum,pageSize,userIds);
			for (SubAccountZhongSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(new BigDecimal(seq.getChangeAmount()));
				seqsVo.setPreAmount(new BigDecimal(seq.getPreAmount()));
				seqsVo.setAmount(new BigDecimal(seq.getAmount()));
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return pageVo;
		}

		if (AccountType.JING_ZAI.getCode().equals(accountTypeCode)){
			Page<SubAccountZaiSeq> page = subAccountZaiService.findSeqByUserIds(pageNum,pageSize,userIds);
			for (SubAccountZaiSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(seq.getChangeAmount());
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages((Integer) page.getTotalPages());
			return pageVo;

		}

		if (AccountType.JING_LING.getCode().equals(accountTypeCode)){
			Page<SubAccountLingSeq> page = subAccountLingService.findSeqByUserIds(pageNum,pageSize,userIds);
			for (SubAccountLingSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(seq.getChangeAmount());
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages(page.getTotalPages());
			return pageVo;
		}

		if (AccountType.JING_YUAN.getCode().equals(accountTypeCode)){
			Page<SubAccountYuanSeq> page = subAccountYuanService.findSeqByUserIds(pageNum,pageSize,userIds);
			for (SubAccountYuanSeq seq :page.getContent()) {
				AccountSeqsVo seqsVo = new AccountSeqsVo();
				BeanUtils.copyProperties(seq,seqsVo);
				seqsVo.setCreateTime(sdf.format(seq.getCreateTime()));
				seqsVo.setChangeAmount(seq.getChangeAmount());
				result.add(seqsVo);
			}
			PageVo<AccountSeqsVo> pageVo = new PageVo<AccountSeqsVo>();
			pageVo.setTotal(page.getTotalElements());
			pageVo.setPageNo(pageNum);
			pageVo.setPageSize(pageSize);
			pageVo.setResult(result);
			pageVo.setTotalPages(page.getTotalPages());
			return pageVo;
		}
		return new PageVo<>();
	}

	private Map<String,Object> pageProcessor(Page page) {
		Map<String,Object> pageMap = new HashMap<>();
		pageMap.put("rows",page.getContent());
		pageMap.put("totalPage",page.getTotalPages());
		pageMap.put("total",page.getTotalElements());
		return pageMap;
	}

	private Map<String,Object> pageHandler(Page page) {
		Map<String,Object> pageMap = new HashMap<>();
		Iterator content = page.getContent().iterator();
		List<Map> resList = new ArrayList<>();
		while (content.hasNext()) {
			JSONObject map = JSONObject.parseObject(JSONObject.toJSONString(content.next()));
			Map<String,Object> temp = new HashMap<>();
			temp.put("id",map.get("id"));
			temp.put("seqFlagCode",map.getString("seqFlagCode"));
			temp.put("seqFlagName",map.getString("seqFlagName"));
			temp.put("changeTypeCode",map.getString("changeTypeCode"));
			temp.put("changeTypeName",map.getString("changeTypeName"));
			BigDecimal changeAmount = map.getBigDecimal("changeAmount");
			if (SeqFlag.INCOME.getCode().equals(map.getString("seqFlagCode"))){
				temp.put("changeAmount","+"+changeAmount.toString());
			} else {
				temp.put("changeAmount",changeAmount.negate().toString());
			}
			temp.put("createTime",map.get("createTime"));
			resList.add(temp);
		}
		pageMap.put("rows",resList);
		pageMap.put("total",page.getTotalElements());
		return pageMap;
	}
}
